package com.xuxu.blog.component;

import cn.hutool.json.JSONObject;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;

import javax.websocket.*;
import javax.websocket.server.PathParam;
import javax.websocket.server.ServerEndpoint;
import java.util.concurrent.CopyOnWriteArraySet;

/**
 * @className: WebSocketByEveryone
 * @author: Maxuxu
 * @date: 2022/8/26 9:22
 * @description: 群聊系统
 */
@ServerEndpoint(value = "/blog/chatroom/{username}")
@Component
@Slf4j
public class WebSocketByEveryone {
        //用来存放每个客户端对应的WebSocketByEveryone对象。
        private static CopyOnWriteArraySet<WebSocketByEveryone> webSocketSet = new CopyOnWriteArraySet<WebSocketByEveryone>();
        //与某个客户端的连接会话，需要通过它来给客户端发送数据
        private Session session;
        /**
         * 连接建立成功调用的方法,此处方法主要用于显示当前在线用户数量
         */
        @OnOpen
        public void onOpen(Session session ,@PathParam("username") String username) {
            this.session = session;
            webSocketSet.add(this);     //加入set中
            log.info("用户【{}】上线了，当前在线人数为：【{}】",username,webSocketSet.size());
            JSONObject jsonObject = new JSONObject();
            jsonObject.set("type", 1);
            jsonObject.set("data", webSocketSet.size());
            this.session.getAsyncRemote().sendText(jsonObject.toString());
        }
        /**
         * 连接关闭调用的方法
         */
        @OnClose
        public void onClose(@PathParam("username") String username) {
            webSocketSet.remove(this);  //从set中删除
            log.info("用户【{}】下线了，当前在线人数是：【{}】", username, webSocketSet.size());
        }
        /**
         * 收到客户端消息后调用的方法
         *
         * @param message 客户端发送过来的消息*/
        @OnMessage
        public void onMessage(String message, Session session) {
            log.info("群发的消息内容是：【{}】", message);
            // JSONObject jsonObject = new JSONObject();
            // jsonObject.set("type", "3");
            // Map<String, String> map = new HashMap<>();
            // map.put("nickname", "静以止动");
            // map.put("userId", "44");
            // map.put("content", "helloworld");
            // map.put("ipAddr", "127.0.0.1");
            // jsonObject.set("data", map);
            // log.debug("自定义的数据类型是：{}",jsonObject.toString());
            //群发消息
            // broadcast(jsonObject.toString());
            broadcast(message);
        }
        /**
         * 发生错误时调用
         *
         */
        @OnError
        public void onError(Session session, Throwable error) {
            log.error("连接错误：【{}】",error);
            error.printStackTrace();
        }
        /**
         * 群发自定义消息
         * */
        public  void broadcast(String message){
            for (WebSocketByEveryone item : webSocketSet) {
                item.session.getAsyncRemote().sendText(message);//异步发送消息.
            }
        }
}
